home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr46 / vfwdk.zip / VFWSDK.ZIP / SAMPLES / MSRLEC / RLEA.ASM < prev   
Assembly Source File  |  1993-01-31  |  11KB  |  456 lines

  1.      page    ,132
  2. ;-----------------------------Module-Header-----------------------------;
  3. ; Module Name:  RLEA.ASM - helper routines for RLE stuff
  4. ;
  5. ; Copyright (c) 1991-1993 Microsoft Corporation
  6. ;
  7. ; Exported Functions:   none
  8. ;
  9. ; Public Functions:     DecodeRle386
  10. ;
  11. ; Public Data:          none
  12. ;
  13. ; General Description:
  14. ;
  15. ; Restrictions:
  16. ;
  17. ;-----------------------------------------------------------------------;
  18.  
  19.     .xlist
  20.     include cmacros.inc
  21.         include windows.inc
  22.         .list
  23.  
  24. RLE_ESCAPE  equ 0
  25. RLE_EOL     equ 0
  26. RLE_EOF     equ 1
  27. RLE_JMP     equ 2
  28.  
  29. ; The following structure should be used to access high and low
  30. ; words of a DWORD.  This means that "word ptr foo[2]" -> "foo.hi".
  31.  
  32. LONG    struc
  33. lo    dw    ?
  34. hi    dw    ?
  35. LONG    ends
  36.  
  37. FARPOINTER    struc
  38. off    dw    ?
  39. sel    dw    ?
  40. FARPOINTER      ends
  41.  
  42. wptr    equ     <word ptr>
  43. bptr    equ     <byte ptr>
  44.  
  45. min_ax  macro   REG
  46.         sub     ax,REG
  47.     cwd
  48.     and    ax,dx
  49.         add     ax,REG
  50.     endm
  51.  
  52. max_ax  macro   REG
  53.         sub     ax,REG
  54.     cwd
  55.     not    dx
  56.         and     ax,dx
  57.         add     ax,REG
  58.     endm
  59.  
  60. ; -------------------------------------------------------
  61. ;        DATA SEGMENT DECLARATIONS
  62. ; -------------------------------------------------------
  63.  
  64. sBegin  Data
  65.  
  66. sEnd  Data
  67.  
  68. ; -------------------------------------------------------
  69. ;               CODE SEGMENT DECLARATIONS
  70. ; -------------------------------------------------------
  71.  
  72. ifndef SEGNAME
  73.     SEGNAME equ <_TEXT>
  74. endif
  75.  
  76. createSeg %SEGNAME, CodeSeg, word, public, CODE
  77.  
  78. sBegin  CodeSeg
  79.         assumes cs,CodeSeg
  80.         assumes ds,nothing
  81.         assumes es,nothing
  82.  
  83. ;---------------------------Macro---------------------------------------;
  84. ; ReadRLE
  85. ;
  86. ;   read a WORD from rle data
  87. ;
  88. ; Entry:
  89. ;    DS:ESI --> rle data
  90. ; Returns:
  91. ;    AX - word at DS:[ESI]
  92. ;    DS:ESI advanced
  93. ; History:
  94. ;       Wed 04-Jan-1990 13:45:58 -by-  Todd Laney [ToddLa]
  95. ;    Created.
  96. ;-----------------------------------------------------------------------;
  97. ReadRLE macro
  98.     lods    wptr ds:[esi]
  99.         endm
  100.  
  101. ;---------------------------Public-Routine------------------------------;
  102. ; DecodeRle386
  103. ;
  104. ;   copy a rle bitmap to a DIB
  105. ;
  106. ; Entry:
  107. ;       pBits       - pointer to rle bits
  108. ; Returns:
  109. ;       none
  110. ; Error Returns:
  111. ;    None
  112. ; Registers Preserved:
  113. ;       BP,DS,SI,DI
  114. ; Registers Destroyed:
  115. ;       AX,BX,CX,DX,FLAGS
  116. ; Calls:
  117. ;    INT 10h
  118. ; History:
  119. ;
  120. ;       Wed 04-Jan-1990 13:45:58 -by-  Todd Laney [ToddLa]
  121. ;    Created.
  122. ;-----------------------------------------------------------------------;
  123.     assumes ds,nothing
  124.         assumes es,nothing
  125.  
  126. cProc   DecodeRle386, <NEAR, PASCAL, PUBLIC>, <ds>
  127.     ParmD    lpbi
  128.     ParmD    pDest
  129.     ParmD    pBits
  130. cBegin
  131. .386
  132.     push    edi
  133.     push    esi
  134.  
  135.         xor     edi,edi
  136.         xor     esi,esi
  137.         xor     eax,eax
  138.         xor     ecx,ecx
  139.  
  140.     lds    si,lpbi
  141.  
  142.     mov    ax,wptr [si].biWidth
  143.     add    ax,3
  144.     and    ax,not 3
  145.     movzx    ebx,ax            ; ebx is next_scan
  146.  
  147.     les    di,pDest
  148.         lds     si,pBits
  149.         assumes ds,nothing
  150.  
  151. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  152. ; Start of RLE decoding
  153. ;
  154. ;   DS:SI   --> RLE bits
  155. ;   ES:DI   --> screen output (points to start of scan)
  156. ;
  157. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  158. RleBltStart:
  159.     mov    edx,edi         ; save start of scan
  160.  
  161. RleBltNext:
  162.         ReadRLE                     ; al=count ah=color
  163.  
  164.         or      al,al               ; is it a escape?
  165.         jz      RleBltEscape
  166.  
  167. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  168. ; We have found a encoded run (al != 0)
  169. ;
  170. ;   al - run length
  171. ;   ah - run color
  172. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  173. RleBltEncodedRun:
  174.         mov     cl,al
  175.     mov    al,ah
  176.  
  177.     shr    cx,1
  178.     rep    stos wptr es:[edi]
  179.     adc    cl,cl
  180.     rep    stos bptr es:[edi]
  181.  
  182.         jmp     short RleBltNext
  183.  
  184. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  185. ; We have found a RLE escape code (al=0)
  186. ; Possibilities are:
  187. ;       . End of Line            -  ah = 0
  188. ;       . End of RLE             -  ah = 1
  189. ;       . Delta                  -  ah = 2
  190. ;       . Unencoded run          -  ah = 3 or more
  191. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  192. RleBltEscape:
  193.         cmp     ah,al
  194.         je      RleBltEOL
  195.  
  196.         inc     al
  197.         cmp     ah,al
  198.         je      RleBltEOF
  199.  
  200.         inc     al
  201.         cmp     ah,al
  202.         je      RleBltDelta
  203.         errn$   RleBltUnencodedRun
  204.  
  205. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  206. ; We have found a un-encoded run (ah >= 3)
  207. ;
  208. ;   ah          is pixel count
  209. ;   DS:SI   --> pixels
  210. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  211. RleBltUnencodedRun:
  212.     mov    cl,ah
  213.  
  214.     shr    cx,1
  215.     rep    movs wptr es:[edi], wptr ds:[esi]
  216.     adc    cl,cl
  217.         rep     movs bptr es:[edi], bptr ds:[esi]
  218.  
  219.     inc    esi              ; !!! re-align source
  220.     and    si,not 1
  221.     jmp    short RleBltNext
  222.  
  223. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  224. ; We have found a delta jump, the next two bytes contain the jump values
  225. ; note the the jump values are unsigned bytes, x first then y
  226. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  227. RleBltDelta:
  228.         ReadRLE                     ; al = deltaX, ah = deltaY
  229.  
  230.         or      ah,ah
  231.         jnz     RleBltDeltaXY
  232.  
  233. RleBltDeltaX:
  234.     add    edi,eax
  235.         jmp     short RleBltNext
  236.  
  237. RleBltDeltaXY:
  238.         add     edi,ebx
  239.         add     edx,ebx
  240.         dec     ah
  241.         jnz     RleBltDeltaXY
  242.  
  243.     add    edi,eax
  244.         jmp     short RleBltNext
  245.  
  246. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  247. ; We have found a end of line marker, point ES:DI to the begining of the
  248. ; next scan
  249. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  250. RleBltEOL:
  251.         mov     edi,edx             ; go back to start of scan
  252.         add     edi,ebx             ; advance to next scan
  253.         jmp     short RleBltStart   ; go get some more
  254.  
  255. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  256. ; We have found a end of rle marker, clean up and exit.
  257. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  258. RleBltEOF:
  259.         errn$   RleBltExit
  260.  
  261. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  262. RleBltExit:
  263.     pop    esi
  264.         pop     edi
  265. .286
  266. cEnd
  267.  
  268. ;---------------------------Macro---------------------------------------;
  269. ; ReadRle286
  270. ;
  271. ;   read a WORD from rle data
  272. ;
  273. ; Entry:
  274. ;       DS:SI --> rle data
  275. ; Returns:
  276. ;       AX - word at DS:[SI]
  277. ;       DS:SI advanced
  278. ; History:
  279. ;       Wed 04-Jan-1990 13:45:58 -by-  Todd Laney [ToddLa]
  280. ;    Created.
  281. ;-----------------------------------------------------------------------;
  282. ReadRle286 macro
  283.         lods    wptr ds:[si]
  284.         endm
  285.  
  286. ;---------------------------Public-Routine------------------------------;
  287. ; DecodeRle286
  288. ;
  289. ;   copy a rle bitmap to a DIB
  290. ;
  291. ; Entry:
  292. ;       pBits       - pointer to rle bits
  293. ; Returns:
  294. ;       none
  295. ; Error Returns:
  296. ;    None
  297. ; Registers Preserved:
  298. ;       BP,DS,SI,DI
  299. ; Registers Destroyed:
  300. ;       AX,BX,CX,DX,FLAGS
  301. ; Calls:
  302. ;    INT 10h
  303. ; History:
  304. ;
  305. ;       Wed 04-Jan-1990 13:45:58 -by-  Todd Laney [ToddLa]
  306. ;    Created.
  307. ;-----------------------------------------------------------------------;
  308.     assumes ds,nothing
  309.         assumes es,nothing
  310.  
  311. cProc   DecodeRle286, <NEAR, PASCAL, PUBLIC>, <ds>
  312.     ParmD    lpbi
  313.     ParmD    pDest
  314.     ParmD    pBits
  315. cBegin
  316.     push    di
  317.     push    si
  318.  
  319.         xor     di,di
  320.         xor     si,si
  321.         xor     ax,ax
  322.         xor     cx,cx
  323.  
  324.     lds    si,lpbi
  325.  
  326.     mov    ax,wptr [si].biWidth
  327.     add    ax,3
  328.     and    ax,not 3
  329.     mov    bx,ax            ; bx is next_scan
  330.  
  331.     les    di,pDest
  332.         lds     si,pBits
  333.         assumes ds,nothing
  334.  
  335. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  336. ; Start of RLE decoding
  337. ;
  338. ;   DS:SI   --> RLE bits
  339. ;   ES:DI   --> screen output (points to start of scan)
  340. ;
  341. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  342. Rle286Start:
  343.     mov    dx,di            ; save start of scan
  344.  
  345. Rle286Next:
  346.         ReadRLE286                  ; al=count ah=color
  347.  
  348.         or      al,al               ; is it a escape?
  349.         jz      Rle286Escape
  350.  
  351. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  352. ; We have found a encoded run (al != 0)
  353. ;
  354. ;   al - run length
  355. ;   ah - run color
  356. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  357. Rle286EncodedRun:
  358.         mov     cl,al
  359.     mov    al,ah
  360.  
  361.     shr    cx,1
  362.     rep    stos wptr es:[di]
  363.     adc    cl,cl
  364.     rep    stos bptr es:[di]
  365.  
  366.         jmp     short Rle286Next
  367.  
  368. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  369. ; We have found a RLE escape code (al=0)
  370. ; Possibilities are:
  371. ;       . End of Line            -  ah = 0
  372. ;       . End of RLE             -  ah = 1
  373. ;       . Delta                  -  ah = 2
  374. ;       . Unencoded run          -  ah = 3 or more
  375. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  376. Rle286Escape:
  377.         cmp     ah,al
  378.         je      Rle286EOL
  379.  
  380.         inc     al
  381.         cmp     ah,al
  382.         je      Rle286EOF
  383.  
  384.         inc     al
  385.         cmp     ah,al
  386.         je      Rle286Delta
  387.         errn$   Rle286UnencodedRun
  388.  
  389. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  390. ; We have found a un-encoded run (ah >= 3)
  391. ;
  392. ;   ah          is pixel count
  393. ;   DS:SI   --> pixels
  394. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  395. Rle286UnencodedRun:
  396.     mov    cl,ah
  397.  
  398.     shr    cx,1
  399.     rep    movs wptr es:[di], wptr ds:[si]
  400.     adc    cl,cl
  401.         rep     movs bptr es:[di], bptr ds:[si]
  402.  
  403.     inc    si              ; !!! re-align source
  404.     and    si,not 1
  405.         jmp     short Rle286Next
  406.  
  407. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  408. ; We have found a delta jump, the next two bytes contain the jump values
  409. ; note the the jump values are unsigned bytes, x first then y
  410. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  411. Rle286Delta:
  412.         ReadRLE286                  ; al = deltaX, ah = deltaY
  413.  
  414.         or      ah,ah
  415.         jnz     Rle286DeltaXY
  416.  
  417. Rle286DeltaX:
  418.     add    di,ax
  419.         jmp     short Rle286Next
  420.  
  421. Rle286DeltaXY:
  422.         add     di,bx
  423.         add     dx,bx
  424.         dec     ah
  425.         jnz     Rle286DeltaXY
  426.  
  427.     add    di,ax
  428.         jmp     short Rle286Next
  429.  
  430. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  431. ; We have found a end of line marker, point ES:DI to the begining of the
  432. ; next scan
  433. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  434. Rle286EOL:
  435.         mov     di,dx             ; go back to start of scan
  436.         add     di,bx             ; advance to next scan
  437.         jmp     short Rle286Start ; go get some more
  438.  
  439. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  440. ; We have found a end of rle marker, clean up and exit.
  441. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  442. Rle286EOF:
  443.         errn$   Rle286Exit
  444.  
  445. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
  446. Rle286Exit:
  447.     pop    si
  448.     pop    di
  449. cEnd
  450.  
  451. sEnd
  452.  
  453. sEnd
  454.  
  455. end
  456.